package icu.feigroup.infrastructure.adapter.repository;

import icu.feigroup.domain.tag.adapter.repository.ITagRepository;
import icu.feigroup.domain.tag.model.entity.CrowdTagsJobEntity;
import icu.feigroup.infrastructure.dao.CrowdTagsDetailMapper;
import icu.feigroup.infrastructure.dao.CrowdTagsJobMapper;
import icu.feigroup.infrastructure.dao.CrowdTagsMapper;
import icu.feigroup.infrastructure.dao.po.CrowdTags;
import icu.feigroup.infrastructure.dao.po.CrowdTagsDetail;
import icu.feigroup.infrastructure.dao.po.CrowdTagsJob;
import icu.feigroup.infrastructure.redis.IRedisService;
import org.redisson.api.RBitSet;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Repository;

import javax.annotation.Resource;
import java.util.DuplicateFormatFlagsException;

/**
 * projectName:icu.feigroup.infrastructure.adapter.repository
 *
 * @author 飞
 * @since 2025/2/21 10:54
 * description:
 */
@Repository
public class TagRepository implements ITagRepository {
    @Resource
    private CrowdTagsMapper crowdTagsMapper;
    @Resource
    private CrowdTagsDetailMapper  crowdTagsDetailMapper;
    @Resource
    private CrowdTagsJobMapper crowdTagsJobMapper;

    @Resource
    private IRedisService redisService;
    @Override
    public CrowdTagsJobEntity queryCrowdTagsJobEntity(String tagId, String batchId) {
        CrowdTagsJob crowdTagsJobReq = new CrowdTagsJob();
        crowdTagsJobReq.setTagId(tagId);
        crowdTagsJobReq.setBatchId(batchId);
        CrowdTagsJob crowdTagsJobRes = crowdTagsJobMapper.queryCrowdTagsJob(crowdTagsJobReq);

        if (crowdTagsJobRes==null) return null;
        return CrowdTagsJobEntity.builder()
                .tagType(crowdTagsJobRes.getTagType())
                .tagRule(crowdTagsJobRes.getTagRule())
                .statStartTime(crowdTagsJobRes.getStatStartTime())
                .statEndTime(crowdTagsJobRes.getStatEndTime())
                .build();
    }

    @Override
    public void addCrowdTagsUserId(String tagId, String userId) {
        CrowdTagsDetail crowdTagsDetailReq = new CrowdTagsDetail();
        crowdTagsDetailReq.setTagId(tagId);
        crowdTagsDetailReq.setUserId(userId);

        //防止唯一索引冲突
        try {
            crowdTagsDetailMapper.addCrowdTagsUserId(crowdTagsDetailReq);
            RBitSet bitSet = redisService.getBitSet(tagId);
            bitSet.set(redisService.getIndexFromUserId(userId),true);
        } catch (DuplicateKeyException ignore){

        }
    }

    @Override
    public void updateCrowdTagsStatistics(String tagId, int count) {
        CrowdTags crowdTagsReq = new CrowdTags();
        crowdTagsReq.setTagId(tagId);
        crowdTagsReq.setStatistics(count);

        crowdTagsMapper.updateCrowdTagsStatistics(crowdTagsReq);
    }
}
